package com.zhang.learn.loglearn;

import org.junit.Test;

import java.io.IOException;
import java.util.logging.*;

/**
 * @author zhanghaolian
 * @Description TODO
 * @ClassName JulLearn
 * @date 2021/2/28 22:28
 */
public class JulLearn {
    /**
     * juc日志技术简单使用
     */
    @Test
    public void testJucSimpleUse() {
        // 1、获取Logger实例
        Logger logger = Logger.getLogger(JulLearn.class.getName());
        // 2、日志记录输出
        logger.info("hello juc.");

        // 3、通用方法进行日志记录
        logger.log(Level.INFO,"juc use generate method.");

        // 4、通过站位符的方式输出变量
        logger.log(Level.INFO,"variable one:{0},variable two:{1}",new Object[]{"aa",1});

    }

    /**
     * juc 有7种日志级别，级别越低，打印越详细
     * juc默认的日志级别是info级别的
     */
    @Test
    public void testLogLevel() {
        // 1、获取Logger实例
        Logger logger = Logger.getLogger(JulLearn.class.getName());
        // 2、日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//只打印到info级别的日志，info以下级别的不打印
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    /**
     * 自定义日志级别
     */
    @Test
    public void testCustomizeLogLevel() {
        // 1、获取Logger实例
        Logger logger = Logger.getLogger(JulLearn.class.getName());

        // 关闭系统默认配置
        logger.setUseParentHandlers(false);
        // 创建ConsoleHandler,控制台输出
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 创建简单的格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        // 进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);
        // 配置日志的具体级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

        // 2、日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//只打印到info级别的日志，info以下级别的不打印
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    /**
     * 保存日志到文件
     * 注意一个logger可以同时打印到控制台以及输出到文件中去
     * 在这个测试中log文件是先建好的
     */
    @Test
    public void testStoreLonToFile() throws IOException {
        // 1、获取Logger实例
        Logger logger = Logger.getLogger(JulLearn.class.getName());

        // 关闭系统默认配置
        logger.setUseParentHandlers(false);
        FileHandler fileHandler = new FileHandler("E:/testStoreLonToFile.log");
        // 创建简单的格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        // 进行关联
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);
        // 配置日志的具体级别
        logger.setLevel(Level.ALL);
        fileHandler.setLevel(Level.ALL);

        // 2、日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//只打印到info级别的日志，info以下级别的不打印
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    /**
     * logger对象的父子关系，有点像java包的父子关系
     */
    @Test
    public void testLoggerParent() {
        // logger1 是 logger2的父对象
        Logger logger1 = Logger.getLogger("com");
        Logger logger2 = Logger.getLogger("com.zhang");

        // 测试
        System.out.println(logger2.getParent().equals(logger1));

        // 所有日志的顶级父元素都是 java.util.logging.LogManager$RootLogger 并且name为空字符串
        System.out.println("logger2 parent:" + logger1.getParent());
        System.out.println("logger2 parent name:" + logger1.getParent().getName());

        System.out.println("===========================================");

        // 取消关联
        logger1.setUseParentHandlers(false);
        // 创建ConsoleHandler,控制台输出
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 进行关联
        consoleHandler.setFormatter(new SimpleFormatter());
        logger1.addHandler(consoleHandler);
        // 配置日志的具体级别
        logger1.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

        // 2、日志记录输出
        logger2.severe("severe");
        logger2.warning("warning");
        logger2.info("info");//只打印到info级别的日志，info以下级别的不打印
        logger2.config("config");
        logger2.fine("fine");
        logger2.finer("finer");
        logger2.finest("finest");
    }

    /**
     * 通过配置文件来配置日志的
     * jul默认的配置文件在：D:\Program Files\Java\jdk1.8.0_131\jre\lib\logging.properties 这个位置
     * 将jre默认的配置文件复制到现classpath 做简单的修改，将日志级别改为ALL
     *
     * # RootLogger 顶级父元素指定的默认处理器为：ConsoleHandler
     * handlers= java.util.logging.ConsoleHandler
     * # RootLogger 顶级父元素指定日志级别为ALL
     * .level= ALL
     *
     * java.util.logging.FileHandler.pattern = %h/java%u.log
     * java.util.logging.FileHandler.limit = 50000
     * java.util.logging.FileHandler.count = 1
     * java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
     *
     * # 向控制台输出的Handler对象的日志级别为:ALL
     * java.util.logging.ConsoleHandler.level = ALL
     * # 向控制台输出的Handler对象的日志格式为:SimpleFormatter
     * java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
     * # 指定日志对象的字符集
     * java.util.logging.ConsoleHandler.encoding = UTF-8
     * java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n
     *
     * com.xyz.foo.level = SEVERE
     */
    @Test
    public void testLogConfigByFile() throws IOException {
        // 1、获取LogManager对象
        LogManager logManager = LogManager.getLogManager();
        // 2、指定配置文件读取路径
        logManager.readConfiguration(JulLearn.class.getClassLoader().getResourceAsStream("logging.properties"));
        // 3、获取Logger对象
        Logger logger = Logger.getLogger(JulLearn.class.getName());

        // 4、日志记录输出，发现所有级别的日志都正常输出，配置文件生效
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }
}
